package com.ccc.netty.server.splitpacket.handler;

import com.ccc.netty.server.splitpacket.pojo.MyMsgProtocol;
import com.ccc.netty.server.splitpacket.service.BusinessDataService;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 自定义解包处理器
 *
 * @author superC
 * @version 1.0.0
 * @date 2022/8/17
 */

@ChannelHandler.Sharable
public class MyDataHandler extends ChannelInboundHandlerAdapter {
    protected static final Logger logger = LoggerFactory.getLogger(MyDataHandler.class);

    private final BusinessDataService businessDataService;

    public MyDataHandler(BusinessDataService businessDataService) {
        this.businessDataService = businessDataService;
    }

    /**
     * 表示 channel 处于就绪状态, 建立连接
     *
     * @param ctx
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        logger.info("【Netty-Server（splitpacket）】——客户端建立连接，客户端地址为{} ，ctx={}", ctx.channel().remoteAddress(), ctx);
    }

    /**
     * 表示 channel 处于不活动状态, 断开连接
     *
     * @param ctx
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        logger.warn("【Netty-Server（splitpacket）】——客户端断开连接，客户端地址为{} ，ctx={}", ctx.channel().remoteAddress(), ctx);
    }

    /**
     * 读取客户端发送的数据
     *
     * @param ctx
     * @param msg 客户端发送数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        logger.info("-------------channel read start-----------");

        MyMsgProtocol myMsgProtocol = (MyMsgProtocol) msg;
        businessDataService.process(myMsgProtocol);

        logger.info("-------------channel read end-----------");
    }


    /**
     * 接收客户端发送的消息完毕
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    /**
     * 异常处理
     *
     * @param ctx
     * @param cause
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        logger.error("【Netty-Server（splitpacket）】——程序异常，客户端地址为{} ，ctx={}", ctx.channel().remoteAddress(), ctx);
        logger.error("【捕获异常-Netty异常】\r\n异常记录：", cause);
        // 关闭socket通道
        ctx.close();
    }

}